/**
 * 来源 http://blog.csdn.net/foruok/article/details/49120183
 * 实现一个Transform流，把输入数据中的小写字母转换为大写字母
 */
// 为了实现自定义的Transform，需要先继承Transform流的功能。
// 实现这一点最简单的办法就是使用util模块的inherits()方法，
// 然后在你的构造器里调用使用call方法把父对象应用到当前对象上

var fs = require('fs');
var util = require('util');
var stream = require('stream');
util.inherits(UpperTransform, stream.Transform);

function UpperTransform(opt){
  stream.Transform.call(this, opt);
}

UpperTransform.prototype._transform = function(chunk, encoding, callback){
  var data = new Buffer(chunk.length);
  var str = chunk.toString('utf8');
  for(var i = 0, offset=0; i < str.length; i++){
    if(/^[a-z]+$/.test(str[i])){
      offset += data.write(str[i].toUpperCase(), offset);
    }else{
      offset += data.write(str[i], offset);
    }
  }
  this.push(data);
  callback();
}

UpperTransform.prototype._flush = function(cb){
  cb();
}

var upper = new UpperTransform();
var inFile = fs.createReadStream('example.txt');
inFile.setEncoding('utf8');
var outFile = fs.createWriteStream('exampleUpper.txt',{defaultEncoding: 'utf8'});

inFile.pipe(upper).pipe(outFile);

